; Mandelbrot set calculator.
; (c) Giles Goddard. 1993

 push es
 push bp
 push si
 push di


 setes

 mov di,[bx]  ; X start
 mov si,2[bx] ; Y start
 mov ax,4[bx] ; X increment
 mov dx,6[bx] ; width

 assume es
 
 mov xinc,ax        
 mov width,dx        
 mov bx,cx
 
 mov cx,width
outloop
 push cx
 push bx

 mov bp,di  ; tx
 mov bx,si  ; ty

 mov word ptr lastz,0
 mov word ptr lastzi,0 

 mov cx,100

inloop
; nz=(z*z)-(zi*zi)
 mov ax,bx  ; zi*zi
 imul ax  
 sal ax,1
 rcl dx,1
 mov nzhigh,dx
 mov nzlow,ax

 mov ax,bp  ; z*z
 imul ax 
 sal ax,1
 rcl dx,1
 sub ax,nzlow
 sbb dx,nzhigh ; (z*z)-(zi*zi)
 mov nzhigh,dx
 
; nzi=(z*zi)*2
 mov ax,bp  
 imul bx  ; z*zi
 sal ax,1
 rcl dx,1
 sal ax,1
 rcl dx,1

; zi=nzi+y
 add dx,si
 jo end
 mov bx,dx
 cmp bx,lastzi
 je end
 mov lastzi,bx

; z=nz+x
 mov dx,nzhigh
 add dx,di
 jo end
 mov bp,dx
 cmp bp,lastz
 je end
 mov lastz,bp

 loop inloop
end 
 pop bx
 assume ds

 mov [bx],cx
 add bx,2

 assume es
 add di,xinc

 pop cx

 dec cx
 jcxz fin
 jmp outloop
fin 

 pop di
 pop si
 pop bp
 pop es
 retf
 
nzhigh dw 0
nzlow dw 0
lastz dw 0
lastzi dw 0
xinc dw 0
width dw 0

